shelter@[]shelters(0);
class shelter
{
int x, y, z;
string map, owner,teamname="";
int fuel=0;
double health=100000;
string hitby="nothing";
string soundloop;
double facing=0;
bool hasplayers=false;
bool broken=false;
bool on=false;
double maxhealth=100000000000000;
string id=randomstring(8);
string compsound;
string sheltername;
double coin;
timer breakintimer;
timer fueltimer;
timer personchecktimer;
timer t;
string[] aplayers(0);
int personchecking=0;
int compcode;
shelter(int sx, int sy, int sz, string smap, string sowner,string n,bool power)
{
x=sx;
y=sy;
z=sz;
map=smap;
owner=sowner;
sheltername=n;
compcode=random(1000,9999);
on=power;
if(on) play("shelter_generatorstart",x,y,z,map);
if(on==true)
{
//soundloop=spawn_moving_sound("shelter_generator.ogg",x,y,z,map);
//compsound=spawn_moving_sound("shelter_computerloop.ogg",0,0,0,sheltername);
}
}
string generate_map()
{
string mapdata="mapname:"+sheltername+"
maxx:0
maxy:1
maxz:50
fightinstate:0
tile:0:0:0:1:0:0:tile1
zone:0:10:0:10:0:50:"+sheltername+"
zone:0:0:0:0:0:9:door out of this cabinet. . Press E to active:
zone:0:0:1:1:0:5:cabinet door. Press E to active:trackme";
return mapdata;
}

void build_shelter(int x, int y, int z, string map, string owner, string name,bool power=true)
{
if(name=="" or name==".")
return;
shelter sh(x,y,z,map,owner,name,power);
shelters.insert_last(sh);
saveshelters();
init_mapsystem();
}
bool has_shelter(player@p)
{
bool ret=false;
for(uint s=0; s<shelters.length(); s+=1)
{
if(shelters[s].is_allowed(p.name) or p.name==shelters[s].owner)
{
ret=true;
}
}
return ret;
}
void saveshelters()
{
file shfile;
if(directory_exists("shelters")==false)
directory_create("shelters");
for(uint i=0; i<shelters.length(); i++)
{
string inv=shelters[i].invdic_to_string();
inv=string_replace(inv,"\r\n",";",true);
shfile.open("shelters/"+shelters[i].sheltername+".shelter","wb");
shfile.write("shelter:"+shelters[i].sheltername+"\r\nid:"+shelters[i].id+"\r\ncoin:"+shelters[i].coin+"\r\npowerstate:"+bool_to_int(shelters[i].on)+"\r\ntime:"+shelters[i].t.elapsed+"\r\nfuel:"+shelters[i].fuel+"\r\nowner:"+shelters[i].owner+"\r\ncompcode:"+shelters[i].compcode+"\r\nshelterx:"+shelters[i].x+"\r\nsheltery:"+shelters[i].y+"\r\nshelterz:"+shelters[i].z+"\r\nsheltermap:"+shelters[i].map+"\r\nshelterhealth:"+shelters[i].health);
if(shelters[i].teamname!="") shfile.write("\r\nshelterteam:"+shelters[i].teamname);
if(shelters[i].aplayers.length>0) shfile.write("\r\naplayers:"+shelters[i].get_allowed_players());
if(inv!="") shfile.write("\r\ninventory:"+inv);
shfile.close();
}
}
void remove_shelter(string sname)
{
for(uint i=0; i<shelters.length(); i++)
{
if(shelters[i].sheltername==sname)
{
play("shelter_generatoroff",shelters[i].x,shelters[i].y,shelters[i].z,shelters[i].map);
destroy_moving_sound(shelters[i].soundloop);
file_delete("shelters/"+shelters[i].sheltername+".shelter");
shelters.remove_at(i);
}
}
}
void load_shelter(string n)
{
if(n=="") return;
string[] invvalues;
string name, aplayers, mapname, owner,id,teamname; double x,y,z,health, coin,fuel,time,compcode;
bool powerstate;
if(string_contains(n,".",1)>-1)
{
return;
}
file f;
f.open("shelters/"+n+".shelter","rb");
string[] sdata=string_split(f.read(),"\r\n",false);
f.close();
for(uint i=0; i<sdata.length(); i++)
{
string[] parsed=string_split(sdata[i],":",false);
if(parsed[0]=="shelter" and parsed.length>1)
{
name=parsed[1];
}
if(parsed[0]=="fuel" and parsed.length()>1)
{
fuel=stn(parsed[1]);
}
if(parsed[0]=="inventory" and parsed.length()>1)
{
invvalues=string_split(parsed[1],";",false);
}
else if(parsed[0]=="time" and parsed.length()>1)
{
time=stn(parsed[1]);
}
else if(parsed[0]=="compcode" and parsed.length()>1)
{
compcode=stn(parsed[1]);
}
else if(parsed[0]=="coin" and parsed.length()>1)
{
coin=stn(parsed[1]);
}
else if(parsed[0]=="id")
{
id=parsed[1];
}
else if(parsed[0]=="aplayers"&&parsed.length>1)
{
aplayers=parsed[1];
}
else if(parsed[0]=="sheltermap")
{
mapname=parsed[1];
}
else if(parsed[0]=="shelterx")
{
x=stn(parsed[1]);
}
else if(parsed[0]=="sheltery")
{
y=stn(parsed[1]);
}
else if(parsed[0]=="shelterz")
{
z=stn(parsed[1]);
}
else if(parsed[0]=="powerstate" and parsed.length()>1)
{
powerstate=int_to_bool(string_to_number(parsed[1]));
}
else if(parsed[0]=="owner")
{
owner=parsed[1];
}
else if(parsed[0]=="shelterteam" and parsed.length>1) teamname=parsed[1];
else if(parsed[0]=="shelterhealth")
{
health=stn(parsed[1]);
}
}
shelter shelt(x,y,z,mapname,owner,name,powerstate);
shelt.health=health;
shelt.owner=owner;
shelt.fuel=fuel;
shelt.coin=coin;
shelt.id=id;
shelt.t.force(time);
shelt.set_allowed_players(aplayers);
if(team_exists(teamname)) shelt.teamname=teamname;
shelt.compcode=stn(compcode);
for(uint i=0; i<invvalues.length(); i++)
{
string[] parsed=string_split(invvalues[i],"=",false);
shelt.give(parsed[0],stn(parsed[1]));
}
shelters.insert_last(shelt);
}
int get_shelter_index(string name)
{
for(uint i=0; i<shelters.length(); i++)
{
if(shelters[i].sheltername==name)
{
return i;
}
}
return -1;
}
int in_shelter(string pname)
{
int index=get_player_index_from(pname);
if(index<0) return -1;
for(uint x=0; x<shelters.length(); x++)
{
if(players[index].map==shelters[x].sheltername) return x;
}
return -1;
}
bool shelter_exists(string sname)
{
return file_exists("shelters/"+sname+".shelter");
}
bool is_near_shelter(int x, int y, int z, int mindist,string map)
{
for(uint i=0; i<shelters.length(); i++)
{
if(get_3d_distance(shelters[i].x,shelters[i].y,shelters[i].z,x,y,z)<=mindist and shelters[i].map==map)
{
return true;
}
}
return false;
}

int get_shelter_from_id(string id)
{
for(uint i=0; i<shelters.length(); i++)
{
if(shelters[i].id==id)
{
return i;
}
}
return -1;
}
